#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

#define MAX 1024
#define SIZE 32

char arg_line[MAX];

char* arg_arr[SIZE];

char buff[SIZE];

int main(int argc,char* argv[],char* env[])
{

    while(true)
    {
        // 0,打印命令提示行，并刷新缓冲区 
        printf("[yx@VM-03-03-centos myshell]# ");

        fflush(stdout);

        // 1，获取命令
        if(fgets(arg_line,MAX,stdin)==NULL)
        {
            continue;
        }

        //printf(arg_line);

        arg_line[strlen(arg_line)-1]='\0';

        size_t len=strlen(arg_line);

        for(size_t i=0;i<len;i++)
        {
            if(arg_line[i]==' ')
            {
                arg_line[i]='\0';
            }
        }

        // 2，分割命令
        int index=0;

        arg_arr[index++]=strtok(arg_line," ");
       
        while(arg_arr[index]=strtok(NULL," "));
        
        // 3，处理内置命令
        
        if(strcmp(arg_arr[0],"cd")==0 && arg_arr[1]!=NULL)
        {
            chdir(arg_arr[1]);

            continue;
        }

        if(strcmp(arg_arr[0],"export")==0 && arg_arr[1]!=NULL)
        {
            strcpy(buff,arg_arr[1]);
            putenv(buff);
            continue;
        }

        // 4，执行命令
        
        pid_t id=fork();

        if(id==0)
        {
            execvpe(arg_arr[0],arg_arr,env);
        }
        else 
        {
            int status=0;
            int ret=waitpid(id,&status,0);

            if(ret>0)
            {
                printf("等待子进程成功---退出信号：%d---退出码：%d\n",status&0x7F,(status>>8)&0xFF);
            }

        }

    }
    


    return 0;
}
